// pages/i/card.js
const cardService = require('../../services/card.js');

Page({

    /**
     * 页面的初始数据
     */
    data: {
        cardList: [], // 卡片列表
        loading: false, // 加载状态
        refreshing: false, // 下拉刷新状态
        hasMore: true, // 是否有更多数据
        page: 1, // 当前页码
        pageSize: 10, // 每页数量
        total: 0, // 总数量
        colorPalette: [ // 颜色调色板
            '#52c41a', // 绿色
            '#1890ff', // 蓝色
            '#722ed1', // 紫色
            '#fa8c16', // 橙色
            '#13c2c2', // 青色
            '#eb2f96', // 粉色
            '#f5222d', // 红色
            '#faad14', // 黄色
            '#a0d911', // 青柠色
            '#2f54eb'  // 深蓝色
        ],

        activeIndex: 1,
        topicList: [],
        topicPage: 1,
        topicPageSize: 10,
        topicTotal: 0,
        topicHasMore: true,
        indicatorDots: false,
        autoplay: false,
        interval: 2000,
        duration: 500,
        circular: true,
        topicPrices: [],
        selectedPrice: 0,

        currentTopic: {},

        // 转赠相关
        showTransferDialog: false, // 是否显示转赠对话框
        transferCardId: null, // 要转赠的卡片ID
        targetPhone: '', // 目标手机号
        transferLoading: false, // 转赠加载状态

        // 自定义面值相关
        showCustomAmountDialog: false,
        customAmount: '',
        customAmountError: ''
    },

    /**
     * 生命周期函数--监听页面加载
     */
    onLoad(options) {
        this.loadCardList(true);
    },

    /**
     * 生命周期函数--监听页面初次渲染完成
     */
    onReady() {

    },

    /**
     * 生命周期函数--监听页面显示
     */
    onShow() {
        // 每次显示页面时刷新数据
        if(this.data.activeIndex == 1){
            this.loadCardList(true);
        }else if(this.data.activeIndex == 2){
            this.loadTopicList(true);
        }
    },

    /**
     * 生命周期函数--监听页面隐藏
     */
    onHide() {

    },

    /**
     * 生命周期函数--监听页面卸载
     */
    onUnload() {

    },

    /**
     * 页面相关事件处理函数--监听用户下拉动作
     */
    onPullDownRefresh() {
        if(this.data.activeIndex == 1){
            this.loadCardList(true);
        }else if(this.data.activeIndex == 2){
            this.loadTopicList(true);
        }
    },

    /**
     * 页面上拉触底事件的处理函数
     */
    onReachBottom() {
        if (this.data.hasMore && !this.data.loading) {
            if(this.data.activeIndex == 1){
                this.loadCardList(false);
            }else if(this.data.activeIndex == 2){
                this.loadTopicList(false);
            }
        }
    },

    /**
     * 用户点击右上角分享
     */
    onShareAppMessage() {

    },

    async loadTopicList(refresh = false) {
        if (this.data.loading) return;

        const page = refresh ? 1 : this.data.topicPage;

        this.setData({
            loading: true,
            refreshing: refresh
        });

        try {
            const result = await cardService.getTopicList({
                page: page,
                pageSize: this.data.topicPageSize,
                showLoading: false
            });

            if (result.success) {
                const { list, total, current_page, last_page, prices } = result.data;

                this.setData({
                    topicList: refresh ? list : [...this.data.topicList, ...list],
                    page: current_page + 1,
                    total: total,
                    hasMore: current_page < last_page,
                    loading: false,
                    refreshing: false,
                    topicPrices: prices,
                    currentTopic: list[0]
                });

                // 停止下拉刷新
                if (refresh) {
                    wx.stopPullDownRefresh();
                }
            } else {
                wx.showToast({
                    title: result.message || '获取话题列表失败',
                    icon: 'none'
                });
                this.setData({
                    loading: false,
                    refreshing: false
                });
            }
        } catch (error) {
            console.error('获取话题列表失败:', error);
            wx.showToast({
                title: '网络错误，请重试',
                icon: 'none'
            });

            this.setData({
                loading: false,
                refreshing: false
            });
        }
    },

    /**
     * 加载卡片列表
     * @param {boolean} refresh 是否刷新（重置页码）
     */
    async loadCardList(refresh = false) {
        if (this.data.loading) return;

        const page = refresh ? 1 : this.data.page;

        this.setData({
            loading: true,
            refreshing: refresh
        });

        try {
            const result = await cardService.getCardList({
                page: page,
                pageSize: this.data.pageSize,
                showLoading: false
            });

            if (result.success) {
                const { list, total, current_page, last_page } = result.data;

                // 处理卡片数据
                const processedList = list.map(item => ({
                    ...item,
                    // 格式化时间
                    created_at_text: item.created_at_text || this.formatTime(item.created_at),
                    expired_at_text: item.expired_at_text || (item.expired_at > 0 ? this.formatTime(item.expired_at) : ''),
                    // 状态样式
                    status_class: this.getStatusClass(item),
                    // 是否过期
                    is_expired: item.is_expired || false,
                    // 分配固定颜色索引
                    color_index: this.getColorIndex(item.id)
                }));

                this.setData({
                    cardList: refresh ? processedList : [...this.data.cardList, ...processedList],
                    page: current_page + 1,
                    total: total,
                    hasMore: current_page < last_page,
                    loading: false,
                    refreshing: false
                });

                // 停止下拉刷新
                if (refresh) {
                    wx.stopPullDownRefresh();
                }
            } else {
                wx.showToast({
                    title: result.message || '获取卡片列表失败',
                    icon: 'none'
                });
                this.setData({
                    loading: false,
                    refreshing: false
                });
            }
        } catch (error) {
            console.error('加载卡片列表失败:', error);
            wx.showToast({
                title: '网络错误，请重试',
                icon: 'none'
            });
            this.setData({
                loading: false,
                refreshing: false
            });
        }
    },

    /**
     * 格式化时间
     * @param {number} timestamp 时间戳
     * @returns {string} 格式化后的时间
     */
    formatTime(timestamp) {
        if (!timestamp) return '';
        const date = new Date(timestamp * 1000);
        return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')} ${String(date.getHours()).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}`;
    },

    /**
     * 获取状态样式类
     * @param {Object} item 卡片项
     * @returns {string} 样式类名
     */
    getStatusClass(item) {
        if (item.is_expired) {
            return 'card-expired';
        }
        if (item.card_item_status === 1) {
            return 'card-used';
        }
        return 'card-active';
    },

    /**
     * 点击卡片项
     * @param {Object} e 事件对象
     */
    onCardTap(e) {
        const { id } = e.currentTarget.dataset;
        if (id) {
            wx.navigateTo({
                url: `/pages/i/card-detail?id=${id}`
            });
        }
    },

    onCodeTap(e) {
        const { id } = e.currentTarget.dataset;
        if (id) {
            wx.navigateTo({
                url: `/pages/i/qrcode`
            });
        }
    },

    /**
     * 转赠他人
     */
    onGiftCard(e) {
        const { id } = e.currentTarget.dataset;
        
        if (!id) {
            wx.showToast({
                title: '卡片ID不能为空',
                icon: 'none'
            });
            return;
        }

        // 显示转赠对话框
        this.setData({
            showTransferDialog: true,
            transferCardId: id,
            targetPhone: ''
        });
    },

    /**
     * 关闭转赠对话框
     */
    onCloseTransferDialog() {
        this.setData({
            showTransferDialog: false,
            transferCardId: null,
            targetPhone: ''
        });
    },

    /**
     * 处理action-sheet的选择事件
     */
    onActionSelect(e) {
        // 这里可以处理action-sheet的选择事件
        // 目前我们不需要这个功能，但保留方法以防后续扩展
        console.log('Action sheet selected:', e.detail);
    },

    /**
     * 输入目标手机号
     */
    onTargetPhoneInput(e) {
        this.setData({
            targetPhone: e.detail.value
        });
    },

    /**
     * 确认转赠
     */
    async onConfirmTransfer() {
        const { transferCardId, targetPhone, transferLoading } = this.data;

        if (transferLoading) return;

        if (!targetPhone) {
            wx.showToast({
                title: '请输入目标手机号',
                icon: 'none'
            });
            return;
        }

        // 验证手机号格式
        if (!/^1[3-9]\d{9}$/.test(targetPhone)) {
            wx.showToast({
                title: '手机号格式不正确',
                icon: 'none'
            });
            return;
        }

        this.setData({
            transferLoading: true
        });

        try {
            const result = await cardService.transferCard({
                cardUserId: transferCardId,
                targetPhone: targetPhone,
                showLoading: false
            });

            this.setData({
                transferLoading: false
            });

            if (result.success) {
                wx.showToast({
                    title: '转赠成功',
                    icon: 'success'
                });
                
                // 关闭对话框
                this.onCloseTransferDialog();
                
                // 刷新卡片列表
                this.loadCardList(true);
            } else {
                wx.showToast({
                    title: result.message || '转赠失败',
                    icon: 'none'
                });
            }
        } catch (error) {
            this.setData({
                transferLoading: false
            });
            console.error('转赠失败:', error);
            wx.showToast({
                title: '网络错误，请重试',
                icon: 'none'
            });
        }
    },

    /**
     * 重新加载数据
     */
    onReload() {
        this.loadCardList(true);
    },

    /**
     * 绑定新卡
     */
    onBindCard() {
        wx.navigateTo({
            url: '/pages/i/bind-card'
        });
    },

    /**
     * 执行绑定卡片
     * @param {string} cardNo 卡号
     * @param {string} cardNumber 卡密
     */
    async bindCard(cardNo, cardNumber) {
        if (!cardNo) {
            wx.showToast({
                title: '请输入有效的卡号',
                icon: 'none'
            });
            return;
        }

        if (!cardNumber) {
            wx.showToast({
                title: '请输入有效的卡密',
                icon: 'none'
            });
            return;
        }

        wx.showLoading({
            title: '绑定中...'
        });

        try {
            const result = await cardService.bindCard({
                cardNo: cardNo,
                cardNumber: cardNumber
            });

            wx.hideLoading();

            if (result.success) {
                wx.showToast({
                    title: '绑定成功',
                    icon: 'success'
                });
                // 刷新卡片列表
                this.loadCardList(true);
            } else {
                wx.showToast({
                    title: result.message || '绑定失败',
                    icon: 'none'
                });
            }
        } catch (error) {
            wx.hideLoading();
            console.error('绑定卡片失败:', error);
            wx.showToast({
                title: '网络错误，请重试',
                icon: 'none'
            });
        }
    },

    /**
     * 根据卡片ID获取固定的颜色索引
     * @param {number} cardId 卡片ID
     * @returns {number} 颜色索引
     */
    getColorIndex(cardId) {
        if (!cardId) return 0;
        // 使用卡片ID的哈希值来确保相同的卡片总是获得相同的颜色
        const hash = this.hashCode(cardId.toString());
        return Math.abs(hash) % this.data.colorPalette.length;
    },

    /**
     * 简单的哈希函数
     * @param {string} str 字符串
     * @returns {number} 哈希值
     */
    hashCode(str) {
        let hash = 0;
        if (str.length === 0) return hash;
        for (let i = 0; i < str.length; i++) {
            const char = str.charCodeAt(i);
            hash = ((hash << 5) - hash) + char;
            hash = hash & hash; // 转换为32位整数
        }
        return hash;
    },

    handleMenuClick(e) {
        const { index } = e.currentTarget.dataset;
        this.setData({
            activeIndex: index
        },function(){
            if(index == 1){
                this.loadCardList(true);
            }else if(index == 2){
                this.loadTopicList(true);
            }
        });
    },

    onBuyCard(e) {
        
        if (!this.data.currentTopic) {
            wx.showToast({
                title: '请选择要主题卡',
                icon: 'none'
            });
            return;
        }

        if(this.data.selectedPrice  <= 0){
            wx.showToast({
                title: '请选择面额',
                icon: 'none'
            });
            return;
        }

        // 显示确认对话框
        wx.showModal({
            title: '确认购买',
            content: '确定要购买这张主题卡吗？',
            success: (res) => {
                if (res.confirm) {
                    this.buyTopicCard();
                }
            }
        });
    },

    /**
     * 购买主题卡
     */
    async buyTopicCard() {
        wx.showLoading({
            title: '创建订单中...'
        });

        try {
            // 调用购买API
            const result = await cardService.buyTopic({
                cardId: this.data.currentTopic.id,
                price: this.data.selectedPrice,
                showLoading: false
            });

            wx.hideLoading();

            if (result.success) {
                // 发起微信支付
                this.requestPayment(result.data);
            } else {
                wx.showToast({
                    title: result.message || '创建订单失败',
                    icon: 'none'
                });
            }
        } catch (error) {
            wx.hideLoading();
            console.error('购买主题卡失败:', error);
            wx.showToast({
                title: '网络错误，请重试',
                icon: 'none'
            });
        }
    },

    /**
     * 发起微信支付
     * @param {Object} payData 支付数据
     */
    requestPayment(payData) {

        wx.requestPayment({
            timeStamp: payData.timeStamp,
            nonceStr: payData.nonceStr,
            package: payData.package,
            signType: payData.signType,
            paySign: payData.paySign,
            success: (res) => {
                console.log('支付成功:', res);
                wx.showToast({
                    title: '支付成功',
                    icon: 'success'
                });
                
                // 支付成功后刷新卡片列表
                setTimeout(() => {
                    this.loadCardList(true);
                }, 1500);
            },
            fail: (err) => {
                console.error('支付失败:', err);
                
                if (err.errMsg.includes('cancel')) {
                    wx.showToast({
                        title: '支付已取消',
                        icon: 'none'
                    });
                } else {
                    wx.showToast({
                        title: '支付失败，请重试',
                        icon: 'none'
                    });
                }
            }
        });
    },

    onPriceSelect(e) {
        const { price } = e.currentTarget.dataset;
        this.setData({
            selectedPrice: price,
            customAmount:0
        });
    },

    onTopicChange(e) {
        const { current } = e.detail;
        this.setData({
            currentTopic: this.data.topicList[current]
        });
    },

    /**
     * 购买主题卡
     */
    onBuyTopic() {
        if (this.data.selectedPrice <= 0) {
            wx.showToast({
                title: '请先选择面值',
                icon: 'none'
            });
            return;
        }

        if (!this.data.currentTopic || !this.data.currentTopic.id) {
            wx.showToast({
                title: '请先选择主题卡',
                icon: 'none'
            });
            return;
        }

        // 显示确认对话框
        wx.showModal({
            title: '确认购买',
            content: `确定要购买"${this.data.currentTopic.name}"主题卡，面值￥${this.data.selectedPrice}吗？`,
            success: (res) => {
                if (res.confirm) {
                    this.buyTopicCard(this.data.currentTopic.id);
                }
            }
        });
    },

    onCustomAmountInput() {
        this.setData({
            showCustomAmountDialog: true,
            customAmount: '',
            customAmountError: ''
        });
    },

    /**
     * 自定义面值输入变化
     */
    onCustomAmountChange(e) {
        const value = e.detail.value;
        this.setData({
            customAmount: value,
            customAmountError: ''
        });
    },

    /**
     * 确认自定义面值
     */
    onConfirmCustomAmount() {
        const amount = parseFloat(this.data.customAmount);
        
        // 验证输入
        if (!this.data.customAmount || this.data.customAmount.trim() === '') {
            this.setData({
                customAmountError: '请输入面值金额'
            });
            return;
        }
        
        if (isNaN(amount) || amount <= 10) {
            this.setData({
                customAmountError: '请输入有效的金额'
            });
            return;
        }
        
        if (amount > 2000) {
            this.setData({
                customAmountError: '面值不能超过2000元'
            });
            return;
        }

        // 设置选中的价格
        this.setData({
            selectedPrice: amount,
            showCustomAmountDialog: false,
            // customAmount: '',
            customAmountError: ''
        });

        wx.showToast({
            title: '设置面额成功',
            icon: 'success'
        });
    },

    /**
     * 取消自定义面值
     */
    onCancelCustomAmount() {
        this.setData({
            showCustomAmountDialog: false,
            customAmount: '',
            customAmountError: ''
        });
    }
})